CloudWatch Eventsで毎日EBSスナップショットを自動取得する
はじめに
CloudWatch Events、やればやるほど可能性が感じられるサービスです。超面白い。
さて、弊社にはソンナコトモアロウカトというツールがあります。CloudFormationを使ってAutoScaling Groupを作成し、スケジュールに従って一時的にEC2を立ち上げてEBSスナップショットを取得するものです。
が、CloudWatch Eventsが出てきたことで不要になりました。今回はCloudWatch Eventsを使って毎日EBSスナップショットを自動取得する仕組みをご紹介します。
やってみた
AWS管理コンソールのCloudWatch画面で[Events]-[Rule]をクリックします。
[Rules]画面で[Create rule]ボタンをクリックします。
[Create rule]画面が表示されます。[Event selector]で[Schedule]を選択します。
CloudWatch Eventsのスケジュールは、Fixed Rate(周期的な実行)による指定と、Crontabライクな指定ができます。今回はCrontabライクな指定をしてみました。月曜日から金曜日のAM1:00です。書き方についてはSchedule Expression Syntax for Rulesを参照してください。なお注意事項として、UTCで実行されます。なので以下の指定だと日本時間ではAM10:00に実行されてしまいます。日本時間のAM1:00を指定する場合には「0 16 ? * 1-5 *」になります。
次に[Targets]-[Add target]をクリックします。
[Select target type]で[Built-in target]を選択します。
Built-in targetは以下のものが用意されています。たくさんある!今回は[Create snapshot of an EBS volume]を選択します。
[Volume ID]で、スナップショットを取りたいEBSのVolume IDを指定します。ここで複数選択したりTagで指定したり出来るとアツいのですが、それをやりたい場合はLambdaで作り込む必要がありますね。その後[Configure details]ボタンをクリック。
[Configure rule details]画面が表示されます。[Name]にわかりやすい名前を、[Description]に説明を入力します。[State]で[Enabled]にチェックが入っていることを確認します。
[AWS permissions]で、スナップショットを取得するためのRoleを設定する必要があります。[Create new role]-[Basic built-in targets role]をクリックします。
IAM画面に遷移しますので、[Allow]ボタンをクリック。
ここで設定されるRoleの内容は以下の通り。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ec2:Describe*", "ec2:RebootInstances", "ec2:StopInstances", "ec2:TerminateInstances", "ec2:CreateSnapshot" ], "Resource": "*" } ] }
[Configure rule details]画面に戻ります。[Create rule]ボタンをクリックします。
これでRuleが作成されました。
あとは時間になったら勝手に実行されてEBSスナップショットを取得してくれます。
便利!実際に運用に乗せるのであれば、古いEBSスナップショットを削除するLambdaを作って、CloudWatch Eventsで定期実行させる必要がありますね。
さいごに
スケジュールで実行も出来るし、 AWS APIをイベントにしてキックも出来る。Lambdaに渡せるので何でも出来ちゃうし、最初から用意されているBuilt-in targetも豊富。これ、バッチサーバという概念自体を消し去るサービスだと思います。すごいですね。